/**
 *
 * @description: 扩展微信公众号
 * @author: junyong.hong
 * @createTime: 2019/10/31
 * @version: 1.0.0.0
 * @history:
 *    1、
 *    2、
 *
 */
let express = require('express')
let request = require('request')
let cache = require('memory-cache')
let config = require('./config')
config = config.wx
let common = require('./../common/index')
let util = require('./../../util/util')
let createHash = require('create-hash')
let xml = require('xml2js')
let router = express.Router()
let dao = require('./../common/db')
let wxpay = require('./../common/wxpay')

// 用户授权重定向
router.get('/redirect', function (req, res) {
    // 重定向地址（授权成功，微信会回跳到这个地址）
    let redirectUrl = req.query.url
    console.log('redirectUrl =======>', redirectUrl)
    cache.put('redirectUrl', redirectUrl)

    // scope授权分为：
    // 静默授权：无感知的，自动跳转过去，只要需要获取openid（昵称、头像、地区、性别）
    // 用户授权(snsapi_userinfo)：获取openid，能获取到用户的昵称、头像、地区、性别、年龄（本项目使用这种方式）
    let scope = req.query.scope
    console.log('scope =======>',scope )

    // 授权后重定向的回调链接地址，请使用 urlEncode 对链接进行处理
    // 本地
    let callback = 'http://m.hjy.com/api/wechat/getOpenId'
    // todo 线上
    // let callback = 'http://www.myoli.xin/api/wechat/getOpenId'
    // https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx3598998b65336a58&redirect_uri=https://myoli.xin/pay/api/wechat/getOpenId&response_type=code&scope=snsapi_userinfo&state=STATE&uin=MjI2MTEwNzU0Mg%3D%3D&key=d351b67a5619f02fda0ebe1054b3c87a64861025aec7cf494a77e63bf138ce46cd2cde063e70f7fd39704d72b9bf0191&pass_ticket=crcyDu4q5u5xqeHHNxyJ2gEDp7B+1QPm7v7AXz9w8qA13Toa5VA9apldLSaEL/I4pHiyF4lez0y69Nwk7gTACw==
    let authorizeUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appId}&redirect_uri=${callback}&response_type=code&scope=${scope}&state=STATE#wechat_redirect`
    console.log('authorizeUrl =======>',authorizeUrl )
    // 重定向
    res.redirect(authorizeUrl)
})

// 根据code获取用户的OpenId
router.get('/getOpenId', async function (req, res) {
    // code是微信自己帮我们拼接的
    // code说明：code作为换取access_token的票据，每次用户授权带上的code将不一样，code只能使用一次，5分钟未被使用自动过期
    let code = req.query.code
    console.log('code=', code)

    if (!code) {
        res.json(util.handleFail('当前未获取到授权code码'))
    } else {
        let result = await common.getAccessToken(code)

        console.log('result =======>', result)
        if (result.code == 0) {
            let data = result.data
            let openId = data.openid

            let expire_time = 1000 * 60 * 60 * 2    // 2个小时过期
            cache.put('access_token', data.access_token, expire_time)
            cache.put('openId', openId, expire_time)
            res.cookie('openId', openId, { maxAge: expire_time })

            // 判断数据库里是否存在用户，不存在就插入数据库
            let userRes = await dao.query({'openid': openId}, 'users')
            if (userRes.code == 0) {
                if (userRes.data.length > 0) {
                    let redirectUrl = cache.get('redirectUrl')
                    res.redirect(redirectUrl)
                } else {
                    let userData = await common.getUserInfo(data.access_token, openId)
                    let insertData = await dao.insert(userData.data, 'users')
                    if (insertData.code == 0) {
                        let redirectUrl = cache.get('redirectUrl')
                        res.redirect(redirectUrl)
                    } else {
                        res.json(insertData)
                    }
                }
            } else {
                res.json(userRes)
            }

        } else {
            res.json(result)
        }
    }
})

// 获取用户信息
router.get('/getUserInfo', async function (req, res) {
    let access_token = cache.get('access_token')
    let openId = cache.get('openId')
    let result = await common.getUserInfo(access_token, openId)
    res.json(result)
})

// 获取js-sdk
router.get('/jssdk', async function (req, res) {
    let url = req.query.url
    let result = await common.getToken()
    if (result.code == 0) {
        let token = result.data.access_token
        cache.put('token', token)

        let result2 = await common.getTicket(token)
        if (result2.code == 0) {
            let data = result2.data

            let params = {
                // 随机数
                noncestr: util.createNonceStr(),
                // 票据
                jsapi_ticket: data.ticket,
                // 时间戳
                timestamp: util.createTimeStamp(),
                // 地址
                url
            }

            // Object转换成json（地址栏格式）并排序
            let str = util.raw(params)
            let sign = createHash('sha1').update(str).digest('hex')

            res.json(util.handleSuc({
                appId: config.appId, // 必填，公众号的唯一标识
                timestamp: params.timestamp, // 必填，生成签名的时间戳
                nonceStr: params.noncestr, // 必填，生成签名的随机串
                signature: sign,// 必填，签名
                jsApiList: [
                    // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容
                    'updateAppMessageShareData',
                    // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容
                    'updateTimelineShareData',
                    'onMenuShareTimeline',
                    'onMenuShareAppMessage',
                    'onMenuShareQQ',
                    'onMenuShareQZone',
                    // 微信支付
                    'chooseWXPay'
                ] // 必填，需要使用的JS接口列表
            }))
        } else {
            res.json(result2);
        }
    } else {
        res.json(result);
    }
})

// 微信公众号支付
router.get('/pay/payWallet', async function (req, res) {
    let openId = req.cookies.openId   // 用户的openid
    let appId = config.appId   // 应用的id
    let attach = '微信支付课程体验'    // 附加数据
    let body = '欢迎学习慕课网首门支付专项课程'    // 支付主体内容
    let total_fee = req.query.money // 支付总金额
    let notify_url = 'http://localhost:3301/api/wehcat/pay/callback'    // 回调要写线上的地址，写本地是没有用的
    // todo 线上部署
    // let notify_url = 'myoli.xin/pay/api/wechat/pay/callback'
    let ip = '192.168.1.164'    // 本机ip地址

    wxpay.order(appId, attach, body, openId, total_fee, notify_url, ip).then((result) => {
        res.json(util.handleSuc(result))
    }).catch((result) => {
        res.json(util.handleFail(result))
    })
})

// 此接口主要用来接收微信支付成功后的回调
router.post('/pay/callback', async function (req, res) {
    xml.parseString(req.rawBody.toString('utf-8'), async function (error, xmlData) {
        if (error) {
            res.send('fail')
            return
        }
        let data = xmlData.xml
        let order = {
            openId: data.openid[0],// 用户的openid
            totalFee: data.total_fee[0],    // 支付金额
            isSubscribe: data.is_subscribe[0],  // 是否关注公众号
            orderId: data.out_trade_no[0],// 订单id
            transactionId: data.transaction_id[0],// 微信支付订单号
            tradeType: data.trade_type[0],// 交易类型
            timeEnd: data.time_end[0]// 什么时间完成的
        }

        //  保存交易订单信息
        let result = await data.insert(order, 'orders')
        if (result.code == 0) {
            let data = `<xml>
                            <return_code><!CDATA[SUCCESS]]</return_code>
                            <return_msg><!CDATA[ok]]</return_msg>
                        </xml>`
            res.send(data)
        } else {
            res.send('fail')
        }
    })

})


module.exports = router